package gestorbienraizok.inmuebles;

import gestorBD.Controlador;
import java.util.LinkedList;

public class Unidad {

    String codigo;
    String nombre;
    String direccion;
    byte estrato;
    private boolean cerrada;
    LinkedList<Torre> listaDeTorres;
    LinkedList<Casa> listaDeCasas;
    ServiciosAdicionales serviciosAdicionales;
    private static int numeroDeUnidadesRegistradas = 0;

    public Unidad() {
        Unidad.numeroDeUnidadesRegistradas++;
    }

    public Unidad(String codigo, String nombre, String direccion, byte estrato, boolean cerrada, ServiciosAdicionales serviciosAdicionales) {
        this.cerrada = cerrada;
        this.codigo = codigo;
        this.nombre = nombre;
        this.direccion = direccion;
        this.estrato = estrato;
        this.listaDeTorres = new LinkedList();
        this.listaDeCasas = new LinkedList();
        this.serviciosAdicionales = serviciosAdicionales;
        Unidad.numeroDeUnidadesRegistradas++;
    }

    public String getCodigo() {
        return this.codigo;
    }

    public String getNombre() {
        return this.nombre;
    }

    public String getDireccion() {
        return this.direccion;
    }

    public byte getEstrato() {
        return this.estrato;
    }

    public boolean getCerrada() {
        return this.cerrada;
    }

    public LinkedList<Torre> getListaDeTorres() {
        return this.listaDeTorres;
    }

    public LinkedList<Casa> getListaDeCasas() {
        return this.listaDeCasas;
    }

    public ServiciosAdicionales getServiciosAdicionales() {
        return this.serviciosAdicionales;
    }

    public static int getNumeroDeUnidadesRegistradas() {
        return Unidad.numeroDeUnidadesRegistradas;
    }

    public void setCodigo(String codigo) {
        this.codigo = codigo;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public void setDireccion(String direccion) {
        this.direccion = direccion;
    }

    public void setEstrato(byte estrato) {
        this.estrato = estrato;
    }

    public void setCerrada(boolean cerrada) {
        this.cerrada = cerrada;
    }

    public void setListaDeTorres(LinkedList<Torre> listaDeTorres) {
        this.listaDeTorres = listaDeTorres;
    }

    public void setListaDeCasas(LinkedList<Casa> listaDeCasas) {
        this.listaDeCasas = listaDeCasas;
    }

    public void setServiciosAdicionales(ServiciosAdicionales serviciosAdicionales) {
        this.serviciosAdicionales = serviciosAdicionales;
    }

    public void setNumeroDeUnidadesRegistradas(int numero) {
        Unidad.numeroDeUnidadesRegistradas = numero;
    }

    public int getNumeroDeCasas() {
        return this.listaDeCasas.size();
    }

    public int getNumeroDeApartamentos() {
        int total = 0;
        for (int i = 0; i < this.listaDeTorres.size(); i++) {
            Torre estaTorre = this.listaDeTorres.get(i);
            total += estaTorre.getNumeroDeApartamentos();
        }
        return total;
    }

    public void agregarTorre(Torre torre) {
        this.listaDeTorres.add(torre);
    }

    public void agregarCasa(Casa casa) {
        this.listaDeCasas.add(casa);
    }

    public static Unidad buscarUnidadPorCodigoDeInmueble(String codigoDelInmueble) {

        boolean esApartamento = codigoDelInmueble.substring(0, 1).equalsIgnoreCase("a");

        for (int i = 0; i < Controlador.getListaDeUnidades().size(); i++) {
            Unidad estaUnidad = Controlador.getListaDeUnidades().get(i);
            if (esApartamento) {
                if (estaUnidad.getNumeroDeApartamentos() != 0) {
                    for (int j = 0; j < estaUnidad.getListaDeTorres().size(); j++) {
                        Torre estaTorre = estaUnidad.getListaDeTorres().get(j);
                        for (int k = 0; k < estaTorre.getNumeroDeApartamentos(); k++) {
                            Apartamento esteApartamento = estaTorre.getListaDeApartamentos().get(k);
                            if (esteApartamento.getCodigo().equalsIgnoreCase(codigoDelInmueble)) {
                                return estaUnidad;
                            }
                        }
                    }
                }

            } else { //Si es casa lo que se busca
                for (int j = 0; j < estaUnidad.getListaDeCasas().size(); j++) {
                    Casa estaCasa = estaUnidad.getListaDeCasas().get(j);
                    if (estaCasa.getCodigo().equalsIgnoreCase(codigoDelInmueble)) {
                        return estaUnidad;
                    }
                }
            }
        }
        return null;
    }

    public static Unidad buscarUnidad(String codigo) {
        for (int i = 0; i < Controlador.getListaDeUnidades().size(); i++) {
            Unidad estaUnidad = Controlador.getListaDeUnidades().get(i);
            if (estaUnidad.getCodigo().equals(codigo)) {
                return estaUnidad;
            }
        }
        return null;
    }

    public static String getResumenCodigoTipoDeInmuebleRolDisponibilidadDeTodosLosInmueblesDeLaUnidad() {
        String desc = new String();

        for (int i = 0; i < Controlador.getListaDeUnidades().size(); i++) {
            Unidad estaUnidad = Controlador.getListaDeUnidades().get(i);
            for (int j = 0; j < estaUnidad.getListaDeTorres().size(); j++) {
                Torre estaTorre = estaUnidad.getListaDeTorres().get(j);
                for (int k = 0; k < estaTorre.getListaDeApartamentos().size(); k++) {
                    Apartamento esteApartamento = estaTorre.getListaDeApartamentos().get(k);
                    desc += String.format("%-9s", esteApartamento.getCodigo());
                    desc += String.format("%-14s", esteApartamento.getTipo());
                    desc += String.format("%-19s", esteApartamento.obtenerRol());
                    desc += esteApartamento.obtenerDisponibilidad() + "\n";
                }
            }

        }
        for (int i = 0; i < Controlador.getListaDeUnidades().size(); i++) {
            Unidad estaUnidad = Controlador.getListaDeUnidades().get(i);
            for (int j = 0; j < estaUnidad.getListaDeCasas().size(); j++) {
                Casa estaCasa = estaUnidad.getListaDeCasas().get(j);
                desc += String.format("%-9s", estaCasa.getCodigo());
                desc += String.format("%-14s", estaCasa.getTipo());
                desc += String.format("%-19s", estaCasa.obtenerRol());
                desc += estaCasa.obtenerDisponibilidad() + "\n";
            }
        }
        desc += "\n";

        return desc;
    }

    @Override
    public String toString() {
        String descripcion = new String();
        descripcion += "Código:       " + this.codigo + "\n";
        descripcion += "Nombre:       " + this.nombre + "\n";
        descripcion += "Dirección:    " + this.direccion + "\n";
        descripcion += "Estrato:      " + this.estrato + "\n";

        return descripcion;
    }
}
